go_bunzee

MIT-Sicp(1) 창필 - 유쾌하고픈 서두(序頭) | 매거진에 참여하세요

questTypeString.01quest1SubTypeString.04
publish_date : 26.01.02

MIT-Sicp(1) 창필 - 유쾌하고픈 서두(序頭)

#MIT #SICP #컴퓨터 #과학 #LISP #HASKELL

content_guide
모든 사람은 일상생활에서 무의식적으로 프로그래밍을 한다. 예컨대 TV를 켜려면 무엇을 해야 할까? 리모컨을 찾고, 전원 버튼을 눌러야 한다.
이 일련의 모든 과정이 프로그래밍이다. 또한 군대, 학교 같은 집단은 규칙과 생활 패턴으로 프로그램화되어 있다.
TV를 켜는 것과 같은 행동에도 처음부터 완벽한 계획은 존재하지 않는다. ―리모컨이 소파 밑에 있는 변수 등― 언제나 예기치 못한 문제는 생긴다.
요컨대, 작은 해결과 그 과정의 축적이 거대한 문제(TV를 켜는 것)를 해결할 수 있다.
프로그래밍은 하나의 지적 활동이다. 이를 이해하려면 컴퓨터 프로그래밍을 아주 많이 해봐야 한다. 프로그램이 무엇을 다루는지, 어떤 목적을 가지는지는 중요하지 않다.
궁극적으로 추구해야 할 것은 제대로 작동하는지, 유지 보수가 얼마나 매끄러운지다. 즉, 완전성과 전체적 적합성, 이 두 가지다.
이 책에서 ‘프로그램’은 컴퓨터에서 실행되는 Lisp로 작성된 프로그램의 생성, 실행, 그리고 연구를 가리킨다.
Lisp로 프로그래밍의 본질에 대해 깊이 고민할 수 있을 것이다.

이 책을 읽는 데 있어 세 가지 현상에 집중해야 한다. 의식, 컴퓨터 프로그램들의 집합, 그리고 컴퓨터다.
모든 컴퓨터 프로그램은 외면의 현실이든 내면의 공상이든, 누군가의 사고일 뿐이다. 그러나 현실의 문제는 복잡하다. 변수가 많다.
그런 프로그램이 우리를 명명백백히 만족시키는 경우는 드물다.
우리가 정성 들여 만든 화려한 람다식이더라도 시간이 지나면 수정된다. 코드는 한 번 짜고 끝나는 것이 아니다.
매번 생기는 변수에 맞추어 끊임없이 준안정 상태로 진화시켜야 한다.
컴퓨터 프로그래밍과 연관된 정열의 근원은 무궁무진한 메커니즘에 있다. 머릿속 로직이 실체가 생길 때 희열을 느낀다. 문제를 바라보는 시각이 넓어진다.
그것이 프로그래밍의 묘미다. 컴퓨터는 한낱 백일몽을, 컴퓨터 프로그램으로 변모시켜 꿈을 실행한다!

고전 컴퓨터의 유일한 단점은 확률적이지 않다는 것이다. 컴퓨터 프로그램은 구체적이어야 하며, 모호하면 안 된다.
우리의 본질을 모든 세부에 걸쳐 명명백백히 표현해야 한다. 논증을 통해 참됨을 증명해야 한다. Lisp 자체도 프로그램이며, 술어 논리로 명세된다.
그러나 프로그램이 커지고 복잡해질수록 ― 유지보수가 이루어지는 프로젝트라면, 피할 수 없는 숙명이다. ― 그 명세 자체가 의심스러워진다.
결국 거대한 프로그램이 ‘명약관화하게 증명’되는 경우는 없다. 큰 프로그램은 작은 프로그램에서 성장해 나간다. 고로, 검증된 무기들로 표준적인 프로그램 구조를 만들어야 한다.
이를 관용구(idiom)라 부른다. 검증된 작은 구조들을 더 큰 구조로 결합하는 법을 배워야 한다.
이러한 기법들은 책에서 자세히 다룬다. 이것을 이해하는 것은 ‘프로그래밍’이라는 프로메테우스적 시도의 첫발이다.
강력한 조직화 방법을 발견하고 숙달하는 일은, 거대한 프로그램의 기초가 된다. 반대로 대규모 프로그램을 작성하는 일은 고되다. 큰 프로그램에 담아야 할 기능, 세부 사항의 간결함을 위해 끊임없이 연구해야 한다.

코드(프로그램)는 상상하는 대로 짤 수 있다. 그러나 하드웨어(컴퓨터)는 물리 법칙에 종속된다.
컴퓨터가 빠르게 동작하려면 ― 상태 변화 하나당 0.3~0.2ns 수준으로 ― 전자의 이동거리는 짧아야 한다.
이토록 좁은 공간에 수많은 소자들이 밀집해 있다. 결국 열은 피할 수 없는 숙명이다. 열과 기능 사이의 균형을 맞춰야 한다.
어떤 경우든 하드웨어는 프로그래밍되는 레이어보다 더 원시적인 레이어에서 작동한다.
Lisp 프로그램을 컴파일하는 과정 자체가 프로그래밍의 또 다른 추상 모델인 것이다.
이런 컴파일 과정을 연구하고 만드는 일은, 다른 프로그래밍을 할 때 ‘조직화 기술’의 깊은 통찰력을 제공해 준다.
물론 컴퓨터 자체도 모델링될 수 있다. 생각해 보라. 트랜지스터의 동작은 미분방정식으로 기술된 양자역학으로 모델링된다. 
그것은 다시 미분방정식을 모델링한다.
그 방정식의 디테일은 프로그램 속 수치적 근사에 의해 표현된다. 그리고 그 프로그램은 다시 컴퓨터 위에서 실행된다.

세 가지 초점(내면, 프로그램, 컴퓨터라는)을 따로 구분하는 건 단순한 전략적 편의가 아니다.
이 세 축을 분리함으로써 기호적 교류가 가속된다. 이 교류가 만들어내는 생동감과 잠재력은 생명의 진화와 비견될 정도로 중대하다.
기껏해야 준안정 상태(잠시 균형을 이룬 상태)일 뿐이다. 흔히 말하듯 "결국 다 머릿속에서 상상하는 일"일지라도.
하드웨어 기술이 발전함에 따라 새로운 기술 스택들이 등장한다. 때때로 스스로에게 물어야 한다. "결국 목표가 뭘까?"
그러나 너무 자주 묻지는 말라. 그렇지 않으면 프로그래밍의 즐거움을 놓친다. 쌉싸름한 철학적 몰두에 빠질지도 모른다.

우리가 작성하는 프로그램들 중 일부는 백준의 수학 파트에서 볼 법한 기능(정렬, 수열 등)을 수행한다.
이러한 프로그램을 알고리즘이라 부른다. 특히 시간 복잡도와 공간 복잡도라는 두 가지 중요한 파라미터를 최적화하는 방식이 잘 알려져 있다.
프로그래머는 좋은 알고리즘과 관용구를 익혀야 한다. 비록 정확한 명세가 아니더라도, 그 성능을 추적하고 개선하는 것은 프로그래머의 책임이다.

Lisp는 약 67년의 역사를 지닌 언어다. 현재는 잘 사용되지 않는다. 그러나 교육적 측면(함수형 프로그래밍)에서는 여전히 가치가 있다. Lisp는 머신러닝의 조상이기 때문이다.
이 언어를 공부함으로써 함수형과 전통 머신러닝의 토대를 익힐 수 있을 것이다. 
Lisp는 변화한다. 이 책에서 사용하는 Scheme 방언은 초기 Lisp에서 발전해 왔다. 다만 두 언어는 다르다. Scheme에는 변수 바인딩에 정적 스코프를 적용하고, 고차함수가 존재한다.
오히려 Algol 60과 가깝다. Algol 60은 은퇴한 언어가 되었지만, 여전히 현대 언어-Python-에는 두 언어의 간결한 리스트 구조가 남아있다.

마지막으로 당부할 건, 이 책이 MIT 학생들만을 위한 교육자료가 아니라는 점이다. 자신이 Lisp에 열정적인 누군가라면, 자신의 프로그램을 끝없이 발전시키고 수정해라.
Sicp는 그런 사람들을 위한 책이다. Lisp의 괄호 둥지 속 부화를 준비하는 모든 동지들에게, 건배!

원문:
Harold Abelson, Gerald Jay Sussman, Julie Sussman,
Structure and Interpretation of Computer Programs,
MIT Press.